package com.atuigu.test;

import com.atguigu.bean.Person;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class IOCTest3 {
    //加载配置文件
    private ApplicationContext ioc = new ClassPathXmlApplicationContext("ioc3.xml");

    /**
     * 实验10：改变ioc容器内bean的创建顺序
     */
    @Test
    public void test10(){

    }

    /**
     * 实验11：bean的作用域（单实例、多实例）
     */
    @Test
    public void test11(){
        System.out.println("=============");
        Person person01 = ioc.getBean("person01", Person.class);
        Person person02 = ioc.getBean("person01", Person.class);
        System.out.println(person01 == person02);// scope="prototype" 多实例，结果false
    }


    /**
     * 实验12：配置通过静态工厂方法创建的bean、实例工厂方法创建的bean、FactoryBean
     *
     *      静态工厂↓↓↓↓↓↓↓
     */
    @Test
    public void test12_StaticFactory(){
        // 获取airPlane01，并不是得到静态工厂
        Object airPlane01 = ioc.getBean("airPlane01");
        // 而是 静态工厂getAirPlane方法，返回的飞机AirPlane的实例对象
        System.out.println(airPlane01);
    }

    /**
     * 实验12：实例工厂↓↓↓↓↓↓↓
     */
    @Test
    public void test12_InstanceFactory(){
        /*
            在ioc启动的时候就已经创建了实例工厂（所有在xml配置文件中<bean>标签的内容都要创建）

            获取airPlane01，并不是得到实例工厂，
        */
        Object airPlane01 = ioc.getBean("airPlane02");
        // 而是 实例工厂的getAirPlane方法，返回的飞机AirPlane的实例对象
        System.out.println(airPlane01);
    }

    /**
     * 实验12：★FactoryBean★↓↓↓↓↓↓↓
     */
    @Test
    public void test12_InterfaceFactoryBean(){
        /*
            按需加载
                1、ioc容器启动的时候不会创建实例
                2、获取的时候才会创建实例对象


            获取到的并不是myFactoryBean工厂对象
        */
        Object myFactoryBean = ioc.getBean("myFactoryBean");
        // 而是工厂内getObject返回的Book对象
        System.out.println(myFactoryBean);
    }

}
